package com.ftg.learn.springbootmq.topic.config;

import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.amqp.core.*;

/**
 * @EnableRetry  : 开启重试
 * @Retryable
 * @Recover
 *
 * @EnableScheduling 开启定时任务
 * @Scheduled
 *      fixedRate 间隔时间
 *      Corn表达式详解（常用）
 *          Corn 表达式可用 秒、分、时、天、周、月、年 来表示：
 * RabbitMQ配置类
 *
 * @author 布衣
 * @since 2025-08-08
 */
@Configuration
public class RabbitMQConfig {

    /**
     * 创建主题交换机
     *
     * @return TopicExchange对象
     */
    @Bean
    public TopicExchange topicExchange() {
        // durable: 是否持久化
        // autoDelete: 是否自动删除
        return new TopicExchange("topic.exchange", true, false);
    }

    /**
     * 创建队列1 - 处理订单相关消息
     *
     * @return Queue对象
     */
    @Bean
    public Queue orderQueue() {
        return new Queue("order.queue", true, false, false);
    }

    /**
     * 创建队列2 - 处理用户相关消息
     *
     * @return Queue对象
     */
    @Bean
    public Queue userQueue() {
        return new Queue("user.queue", true, false, false);
    }

    /**
     * 创建队列3 - 处理商品相关消息
     *
     * @return Queue对象
     */
    @Bean
    public Queue productQueue() {
        return new Queue("product.queue", true, false, false);
    }

    /**
     * 绑定订单队列到主题交换机 - 使用路由键 "order.*"
     *
     * @return Binding对象
     */
    @Bean
    public Binding orderBinding() {
        return BindingBuilder.bind(orderQueue())
                .to(topicExchange())
                .with("order.*");
    }

    /**
     * 绑定用户队列到主题交换机 - 使用路由键 "user.*"
     *
     * @return Binding对象
     */
    @Bean
    public Binding userBinding() {
        return BindingBuilder.bind(userQueue())
                .to(topicExchange())
                .with("user.*");
    }

    /**
     * 绑定商品队列到主题交换机 - 使用路由键 "product.*"
     *
     * @return Binding对象
     */
    @Bean
    public Binding productBinding() {
        return BindingBuilder.bind(productQueue())
                .to(topicExchange())
                .with("product.*");
    }

    /**
     * 创建通用队列 - 接收所有类型的消息
     *
     * @return Queue对象
     */
    @Bean
    public Queue allQueue() {
        return new Queue("all.queue", true, false, false);
    }

    /**
     * 绑定通用队列到主题交换机 - 使用通配符 "#"
     *
     * @return Binding对象
     */
    @Bean
    public Binding allBinding() {
        return BindingBuilder.bind(allQueue())
                .to(topicExchange())
                .with("#");
    }
}

